﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Diagnostics.Contracts;

namespace Numero2DataSet
{
    public partial class Form1 : Form
    {
        ConnexionDB connexion;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            connexion = ConnexionDB.Creer();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Contract.Requires(connexion != null, "La connexion doit être définie.");

            connexion.ResetDataSet();
            listBox1.Items.Clear();
            foreach (DataColumn column in connexion.DataSet.Tables["cours"].Columns)
            {
                listBox1.Items.Add(column.ColumnName + " - " + column.DataType.Name);
            }
            listBox2.Items.Clear();
            foreach (DataColumn column in connexion.DataSet.Tables["etudiants"].Columns)
            {
                listBox2.Items.Add(column.ColumnName + " - " + column.DataType.Name);
            }
            listBox3.Items.Clear();
            foreach (DataColumn column in connexion.DataSet.Tables["resultats"].Columns)
            {
                listBox3.Items.Add(column.ColumnName + " - " + column.DataType.Name);
            }
        }

        private void btnB_Click(object sender, EventArgs e)
        {
            Contract.Requires(connexion != null, "La connexion doit être définie.");

            string selectCommand = "SELECT e.matricule as matricule, e.prenom as Prénom, e.nom as Nom, c.sigle as Sigle, c.nom as NomCours from etudiants e, cours c, resultats r where r.sigle = c.sigle and r.matricule = e.matricule order by e.matricule";
            OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand, connexion.OleConnexion);
            connexion.ResetDataSet();
            adapter.Fill(connexion.DataSet, "requeteB");
            string dernierMatricule = string.Empty;
            listView1.Items.Clear();
            foreach (DataRow ligne in connexion.DataSet.Tables["requeteB"].Rows)
            {
                ListViewItem item = new ListViewItem(" \"    \"");
                if (!ligne["matricule"].ToString().Equals(dernierMatricule))
                {
                    item = new ListViewItem(ligne["Prénom"].ToString());
                    item.SubItems.Add(ligne["Nom"].ToString());
                    dernierMatricule = ligne["matricule"].ToString();
                }
                else
                {
                    item.SubItems.Add(" \"   \"");
                }
                item.SubItems.Add(ligne["Sigle"].ToString());
                item.SubItems.Add(ligne["NomCours"].ToString());
                listView1.Items.Add(item);
            }
        }

        private void btnC_Click(object sender, EventArgs e)
        {
            Contract.Requires(connexion != null, "La connexion doit être définie.");

            connexion.ResetDataSet();
            connexion.DataSet.Relations.Add("resultatsEtudiant", connexion.DataSet.Tables["etudiants"].Columns["matricule"], connexion.DataSet.Tables["resultats"].Columns["matricule"]);
            connexion.DataSet.Relations.Add("resultatsCours", connexion.DataSet.Tables["cours"].Columns["sigle"], connexion.DataSet.Tables["resultats"].Columns["sigle"]);

            foreach (DataRow ligne in connexion.DataSet.Tables["etudiants"].Rows)
            {
                bool dejaPasse;
                ListViewItem item = new ListViewItem(ligne["prenom"].ToString());
                item.SubItems.Add(ligne["nom"].ToString());
                dejaPasse = false;
                foreach (DataRow ligneEnfant in ligne.GetChildRows("resultatsEtudiant"))
                {
                    if (dejaPasse)
                    {
                        item = new ListViewItem(" \"    \"");
                        item.SubItems.Add(" \"   \"");
                    }
                    item.SubItems.Add(ligneEnfant["sigle"].ToString());
                    item.SubItems.Add(ligneEnfant.GetParentRow("resultatsCours")["nom"].ToString());
                    listView2.Items.Add(item);
                    dejaPasse = true;
                }
            }
        }

        private void btnD_Click(object sender, EventArgs e)
        {
            Contract.Requires(connexion != null, "La connexion doit être définie.");

            connexion.ResetDataSet();
            string selectCommand = "SELECT e.matricule as matricule, e.prenom as Prénom, e.nom as Nom, c.sigle as Sigle, c.nom as NomCours from etudiants e, cours c, resultats r where r.sigle = c.sigle and r.matricule = e.matricule";
            OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand, connexion.OleConnexion);
            adapter.Fill(connexion.DataSet, "requeteD");

            var requeteD = from ligneDonnees in connexion.DataSet.Tables["requeteD"].AsEnumerable()
                           orderby ligneDonnees["matricule"]
                           select ligneDonnees;

            string dernierMatricule = string.Empty;
            foreach (DataRow ligne in requeteD)
            {
                ListViewItem item = new ListViewItem(" \"    \"");
                if (!ligne["matricule"].ToString().Equals(dernierMatricule))
                {
                    item = new ListViewItem(ligne["Prénom"].ToString());
                    item.SubItems.Add(ligne["Nom"].ToString());
                    dernierMatricule = ligne["matricule"].ToString();
                }
                else
                {
                    item.SubItems.Add(" \"   \"");
                }
                item.SubItems.Add(ligne["Sigle"].ToString());
                item.SubItems.Add(ligne["NomCours"].ToString());
                listView3.Items.Add(item);
            }
        }

        private void btnE_Click(object sender, EventArgs e)
        {
            Contract.Requires(connexion != null, "La connexion doit être définie.");

            connexion.ResetDataSet();
            connexion.DataSet.Relations.Add("resultatsEtudiant", connexion.DataSet.Tables["etudiants"].Columns["matricule"], connexion.DataSet.Tables["resultats"].Columns["matricule"]);
            connexion.DataSet.Relations.Add("resultatsCours", connexion.DataSet.Tables["cours"].Columns["sigle"], connexion.DataSet.Tables["resultats"].Columns["sigle"]);

            var requeteE = connexion.DataSet.Tables["resultats"].AsEnumerable().Select(f =>
            new
            {
                Sigle = f["sigle"].ToString(), 
                Matricule = f["matricule"].ToString(), 
                NomCours = f.GetParentRow("resultatsCours")["nom"].ToString(),
                PrenomEtudiant = f.GetParentRow("resultatsEtudiant")["prenom"].ToString(),
                NomEtudiant = f.GetParentRow("resultatsEtudiant")["nom"].ToString()
            });



            string dernierMatricule = string.Empty;
            foreach (var resultat in requeteE)
            {
                ListViewItem item = new ListViewItem(" \"    \"");
                if (!resultat.Matricule.Equals(dernierMatricule))
                {
                    item = new ListViewItem(resultat.PrenomEtudiant);
                    item.SubItems.Add(resultat.NomEtudiant);
                    dernierMatricule = resultat.Matricule;
                }
                else
                {
                    item.SubItems.Add(" \"   \"");
                }
                item.SubItems.Add(resultat.Sigle);
                item.SubItems.Add(resultat.NomCours);
                listView4.Items.Add(item);
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            ConnexionDB.Detruire();
        }        
    }
}
